﻿#define  _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

//整数的二进制表示方法有三种，原码，反码，补码
//有符号整数的三种表示方法均有符号位和数值位两部分组成，2进制序列中，最高位的1位都是被当作符号位，剩余的都是数值位。
//符号位都是用0表示“正”，用1表示“负”

//int main()
//{
//	int a = -10; 
//	//-10是存放在a中，a是整型变量，是4个字节，32个bit位
//	//1000 0000 0000 0000 0000 0000 0000 1010 原码
//	//1111 1111 1111 1111 1111 1111 1111 0101 反码（符号位不变，其他位依次取反）
//	//1111 1111 1111 1111 1111 1111 1111 0110 补码（反码+1）
//
//	int b = 10;  //正整数的原码反码补码相同
//	//0000 0000 0000 0000 0000 0000 0000 1010 原码
//	//0000 0000 0000 0000 0000 0000 0000 1010 反码
//	//0000 0000 0000 0000 0000 0000 0000 1010 补码
//	printf("%d",a);
//	return 0;
//}
//对于整型来说：数据存放内存中其实存放的是补码。

//因为cpu只有加法器
//1-1
//1+（-1）
//0000 0000 0000 0000 0000 0000 0000 0001 
//-1
//1000 0000 0000 0000 0000 0000 0000 0001
//1111 1111 1111 1111 1111 1111 1111 1110
//1111 1111 1111 1111 1111 1111 1111 1111 补码
//1 0000 0000 0000 0000 0000 0000 0000 0000，1+（-1）相加为整数，整数只能存32个bit位
//于是1舍弃
//0000 0000 0000 0000 0000 0000 0000 0000 于是得到0 

//按位与&，这里位代表二级制位
//int main()
//{
//	int a = 3;  //0000 0000 0000 0000 0000 0000 0000 0011
//	int b = -5; //1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
//	           //&---------------------------------------
//	            //0000 0000 0000 0000 0000 0000 0000 0011 = 3
//	           
//	
//	int c = a & b;
//	printf("%d ",c);
//	return 0;
//}

//按位或，这里位表示二进制位，只要有1就为1，两个都是0才是0
//int main()
//{
//	int a = 3;  //0000 0000 0000 0000 0000 0000 0000 0011
//	int b = -5; //1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
//	           //|---------------------------------------
//	            //1111 1111 1111 1111 1111 1111 1111 1011 因为这是负数所以求得原码
//	            //1000 0000 0000 0000 0000 0000 0000 0100  取反
//	            //1000 0000 0000 0000 0000 0000 0000 0101  +1 = -5
//	           
//	
//	int c = a | b;
//	printf("%d ",c);
//	return 0;
//}

//按位异或^，相同为0，相异为1
//int main()
//{
//	int a = 3;  //0000 0000 0000 0000 0000 0000 0000 0011
//	int b = -5; //1111 1111 1111 1111 1111 1111 1111 1011  -5的补码
//			   //^---------------------------------------
//				//1111 1111 1111 1111 1111 1111 1111 1000 因为这是负数所以求得原码
//				//1000 0000 0000 0000 0000 0000 0000 0111  取反
//				//1000 0000 0000 0000 0000 0000 0000 1000  +1 = -8
//
//
//	int c = a ^ b;
//	printf("%d ", c);
//	return 0;
//}

//按位取反
//int main()
//{
//	int a = 3;  //0000 0000 0000 0000 0000 0000 0000 0011
//	          //~a1111 1111 1111 1111 1111 1111 1111 1100
//	            //1000 0000 0000 0000 0000 0000 0000 0011
//	            //1000 0000 0000 0000 0000 0000 0000 0100  = -4
//
//	int c = ~a;
//	printf("%d ", c);
//	return 0;
//}

//题目：不能创建临时变量实现两个整数的交换
//方法1：在这里用到了第三方变量c
//int main()
//{
//	int a = 5;
//	int b = 3;
//	int c = 0;
//	printf("交换前：a = %d，b = %d\n", a, b);
//	c = a;
//	a = b;
//	b = c;
//	printf("交换后：a = %d，b = %d\n", a, b);
//
//	return 0;
//}

//方法2
//但是这种方法存在问题：如果a和b的很大，但是没有超出整型的大小，a和b的值的和超出了整型的大小，超出整形大小的值之后，有些值就溢出了丢了，这样和就不准确了，导致后面求出的值是错误的
//int main()
//{
//	int a = 5;
//	int b = 3;
//	printf("交换前：a = %d，b = %d\n", a, b);
//	a = a + b;
//	b = a - b; //此时b = a + b - b = a;
//	a = a - b; //此时a = a + b - a = b;
//	printf("交换后：a = %d，b = %d\n", a, b);
//
//	return 0;
//}

//方法三
//a 0000 0000 0000 0000 0000 0000 0000 0101
//b 0000 0000 0000 0000 0000 0000 0000 0011
//^ 0000 0000 0000 0000 0000 0000 0000 0110  a = a^b
//^ 0000 0000 0000 0000 0000 0000 0000 0101  b = a^b = a
//^ 0000 0000 0000 0000 0000 0000 0000 0011  a = a^b = a
//根据异或规律 a^a = 0;
//0^a = a;
// b  = a^b^b = a^0 = a
//int main()
//{
//	int a = 5;
//	int b = 3;
//	printf("交换前：a = %d，b = %d\n", a, b);
//	a = a ^ b;
//	b = a ^ b; 
//	a = a ^ b; 
//	printf("交换后：a = %d，b = %d\n", a, b);
//
//	return 0;
//}


//编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//方法1：按位与&，任何数与上1，只有都为1才为1，否则为0
//int addcou(int i)
//{
//	int count = 0;
//	int x = 32;
//	while (x != 0)
//	{
//		if ((i & 1) == 1)
//		{
//			count += 1;
//		}
//		i = i >> 1;
//		x--;
//	}
//	return count;
//}
//int main()
//{
//	int i = 0;
//	scanf("%d", &i);
//	int count = addcou(i);
//	printf("%d", count);
//	return 0;
//}


//方法2：n&（n-1）每次执行都去掉一个1，直到结束为0；
//int addcou(int i)
//{
//	int count = 0;
//	while (i)
//	{
//		i = i & (i - 1);
//		count++;
//	}
//	return count;
//}
//int main()
//{
//	int i = 0;
//	scanf("%d", &i);
//	int count = addcou(i);
//	printf("%d", count);
//	return 0;
//}


//思考题：如何判断一个数是否是2的次方数
//因为n&(n-1)执行一次就去掉一个1，如果是2的次方数，那么只会存在一个1，所以这个n&（n-1）执行一次就会等于0

//8 1000
//9 1001
//int main()
//{
//	int n = 0;
//	scanf("%d",&n);
//	if ((n & (n - 1)) == 0)
//	{
//		printf("%d ", n);
//	}
//	
//}

//逗号表达式，从左向右依次计算，逗号表达式的结果为最后一个表达式的结果

//案例1
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);
//	      //   0     a=12 ,     12  13
//	printf("%d\n", c);
//	return 0;
//}

//案例2
//int main()
//{
//	int a = 0, b = 0, c = 0, d = 0;
//	if (a = b + 1, c = a / 2, d > 0)  //在这里执行逗号表达式，a=b+1=1，c=a/2=1/2=0，d<0为假等于0,所以表达式结果为0不能进入if语句
//	{
//		printf("a = %d\n", a);
//		printf("c = %d\n", c);
//
//	}
//	printf("a = %d\n", a); //验证逗号表达式是否执行，a=1
//	printf("c = %d\n", c);
//	return 0;
//}

//案例3，逗号表达式精简步骤，使冗余的代码不在冗余
//a = get_val();
//count_val(a);
//while (a > 0)
//{
//	//业务处理
//	a = get_val();
//	count_val(a);
//}
//如果使⽤逗号表达式，改写：
//while (a = get_val(), count_val(a), a > 0)
//{
//	//业务处理
//}


//结构体
//创造一个新的类型
//struct student
//{
//	char name[20];//名字
//	int age;//年龄
//	int high;//身高
//	float wight;//体重
//	char id[16];//学号
//}p3,p4;//分号不能省略
//struct student p5;
//在上面p3，p4等效于p5，他们都是是全局变量
//
//结构是一些值的集合，这些值称为成员变量，结构的每个成员可以是不同类型的变量，如：标量，数组，指针，甚至是其他结构体。
//int main()
//{
//	struct student p1 = {"张三",20,173,60,"2021111"}; //初始化,这里是按照上面类型中定义的成员变量一个个依次赋值的
//	struct student p2 = {.age = 30,.name = "lisi",.high = 165,.wight = 60,.id = "201212"}; //这里初始化，按照自己想要的初始化排序进行初始化 
//	p1，p2都是结构体变量，不过他们是局部变量
//
//	printf("%s",p1.name);
//	return 0;
//}

//整型提升
//int main()
//{
//	char a = 3; //3是整型变量（32个比特位），但是用char存储，发生截断
//	//0000 0000 0000 0000 0000 0000 0000 0000 0011
//	//0000 0011
//	char b = 127;
//	//0000 0000 0000 0000 0000 0000 0000 0111 1111
//	//0111 1111
//
//	char c = a + b;
//	//0000 0000 0000 0000 0000 0000 0000 0000 0011
//	//0000 0000 0000 0000 0000 0000 0000 0111 1111
//	//0000 0000 0000 0000 0000 0000 0000 1000 0010
//	//1000 0010 截断
//
//	printf("%d\n", c);
//	//1111 1111 1111 1111 1111 1111 1111 1000 0010 整型提升，以%d打印
//	//1000 0000 0000 0000 0000 0000 0000 0111 1101 取反
//	//1000 0000 0000 0000 0000 0000 0000 0111 1110 +1得到原码 = -126
//	return 0;
//}


//-5
//1000 0000 0000 0000 0000 0000 0000 0101
//1111 1111 1111 1111 1111 1111 1111 1010
//1111 1111 1111 1111 1111 1111 1111 1011

//输入两个整数，求两个整数二进制格式有多少个位不同
//^相同为0，相异为1
#include <stdio.h>
int main() {
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF)
    {
        a = a ^ b;
        int count = 0;
        while (a)
        {
            a = a & (a - 1);
            count++;
        }
        printf("%d\n", count);
    }
    return 0;
}